﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OWLServer.owl.utilidades;
using OWLServer.owl.tipos;
using OWLServer.persistencia.interfaces;
using OWLServer.persistencia.ado;
using OWLServer.owl.conversores;
using OWLServer.owl.etiquetas;

namespace OWLServer
{
    public partial class FOWLServer : Form
    {
        private GestorOntologias conver = new GestorOntologias();
        private Ontologia ontologiaSeleccionada;
        private IList<Ontologia> listado;
        private DateTime inicio;

        public FOWLServer()
        {
            InitializeComponent();
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                inicio = DateTime.Now;
                activarElementos(false);
                bWNuevaOntologia.RunWorkerAsync();
            }
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            activarElementos(false);
            bWEliminarOntologia.RunWorkerAsync();            
        }

        private void activarElementos(bool activar)
        {
            button1.Enabled = activar;
            button2.Enabled = activar;
            DGVOntologias.Enabled = activar;
        }

        /// <summary>
        /// Muestra los problemas en la lista
        /// </summary>
        /// <param name="problemas"></param>
        private void mostrarProblemas(IList<Problema> problemas)
        {
            lBProblemas.Items.Clear();
            foreach (Problema problema in problemas)
            {
                lBProblemas.Items.Add(problema);
            }
        }

        private void bWNuevaOntologia_DoWork(object sender, DoWorkEventArgs e)
        {
            Ontologia ont = null;
            try
            {
                bWNuevaOntologia.ReportProgress(0);
                ont = conver.conversorOWLToOntologia(openFileDialog1.FileName);
                bWNuevaOntologia.ReportProgress(33);
                conver.almacenarOntologia(ont, false);
                bWNuevaOntologia.ReportProgress(80);
                cargarListadoOntologias();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                ont = null;
            }
            this.ontologiaSeleccionada = ont;
        }

        private void bWNuevaOntologia_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (ontologiaSeleccionada != null)
                {
                    mostrarProblemas(ontologiaSeleccionada.Problemas);
                    progressBar1.Value = 100;
                    TimeSpan diferencia = DateTime.Now.Subtract(inicio);
                    MessageBox.Show("Se ha insertado correctamente en " + diferencia.TotalSeconds + " segundos.");
                    ontologiaSeleccionada = null;
                }
                cargarTablaOntologias();
                progressBar1.Value = 100;
                activarElementos(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void bWNuevaOntologia_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void bWEliminarOntologia_DoWork(object sender, DoWorkEventArgs e)
        {
            try {
                bWEliminarOntologia.ReportProgress(30);
                conver.limpiarOntologiasSistema();
                bWEliminarOntologia.ReportProgress(80);
                cargarListadoOntologias();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void bWEliminarOntologia_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                lBProblemas.Items.Clear();
                cargarTablaOntologias();
                progressBar1.Value = 100;
                MessageBox.Show("Se han eliminado todas la ontologias del sistema.");
                activarElementos(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void bWEliminarOntologia_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void FPrueba_Load(object sender, EventArgs e)
        {
            try
            {
                cargarListadoOntologias();
                cargarTablaOntologias();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        /// <summary>
        /// Carga la tabla de ontologias
        /// </summary>
        private void cargarListadoOntologias()
        {
            listado = conver.listadoOntologias(false);
        }

        /// <summary>
        /// Carga la tabla de ontologias
        /// </summary>
        private void cargarTablaOntologias()
        {
            DGVOntologias.Rows.Clear();
            foreach (Ontologia ontologia in listado)
            {
                DGVOntologias.Rows.Add(ontologia, ontologia.EspacioNombresPrincipal);
            }
        }

        private void agregarIndividuosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (DGVOntologias.SelectedRows.Count == 1)
                {
                    Ontologia ontologia = DGVOntologias.SelectedRows[0].Cells[0].Value as Ontologia;
                    ontologiaSeleccionada = ontologia;
                    DialogResult result = openFileDialog1.ShowDialog();
                    if (result == DialogResult.OK)
                    {
                        activarElementos(false);
                        bWAgregarIndividuos.RunWorkerAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        /// <summary>
        /// Maneja el evento del click de raton sobre la tabla de ontologias
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DGVOntologias_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                CMSOntologia.Show(Control.MousePosition);
            }
        }

        private void bWAgregarIndividuos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                bWAgregarIndividuos.ReportProgress(0);
                if (conver.existeOntologia(openFileDialog1.FileName))
                {
                    // Recuperamos la completa de la base de datos
                    ontologiaSeleccionada = conver.recuperarOntologiaCompleta(ontologiaSeleccionada);
                    bWAgregarIndividuos.ReportProgress(20);
                    ontologiaSeleccionada = conver.agregarIndividuosOWLToOntologia(openFileDialog1.FileName, ontologiaSeleccionada);
                    bWAgregarIndividuos.ReportProgress(40);
                    conver.actualizarOntologia(ontologiaSeleccionada);
                    bWAgregarIndividuos.ReportProgress(80);
                }
                else
                {
                    MessageBox.Show("La ontologia no existe en el sistema!");
                    ontologiaSeleccionada = null;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void bWAgregarIndividuos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void bWAgregarIndividuos_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (ontologiaSeleccionada != null)
                {
                    mostrarProblemas(ontologiaSeleccionada.Problemas);
                    MessageBox.Show("Se han insertado los individuos correctamente.");
                    ontologiaSeleccionada = null;
                }
                progressBar1.Value = 100;
                activarElementos(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void verOntologíaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (DGVOntologias.SelectedRows.Count == 1)
                {
                    Ontologia ontologia = DGVOntologias.SelectedRows[0].Cells[0].Value as Ontologia;
                    ontologia = conver.recuperarOntologiaCompleta(ontologia);
                    FOntologia fOntologia = new FOntologia(ontologia);
                    fOntologia.ShowDialog(this);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
